package com.springboot.frame.starter.pay.v3.resq;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;

/**
 * @author liheng
 * @ClassName FacilV3PayProfitSharingResqBody
 * @Description
 * @date 2021-09-02 16:40
 */
@Data
public class FacilV3PayProfitSharingResqBody {
    /**
     * 微信支付分配的子商户号，即分账的出资商户号。
     * 示例值：1900000109
     */
    @JsonProperty("sub_mchid")
    private String subMchid;
    /**
     * 微信分配的服务商appid
     * 示例值：wx8888888888888888
     */
    private String appid;
    /**
     * 微信分配的子商户公众账号ID，分账接收方类型包含PERSONAL_SUB_OPENID时必填。
     */
    @JsonProperty("sub_appid")
    private String subAppid;
    /**
     * 微信支付订单号
     */
    @JsonProperty("transaction_id")
    private String transactionId;
    /**
     * 服务商系统内部的分账单号，在服务商系统内部唯一，同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@
     * 示例值：P20150806125346
     */
    @JsonProperty("out_order_no")
    private String outOrderNo;
    /**
     * 分账接收方列表，可以设置出资商户作为分账接受方，最多可有50个分账接收方
     */
    private List<Receivers> receivers;
    /**
     * 1、如果为true，该笔订单剩余未分账的金额会解冻回分账方商户；
     * 2、如果为false，该笔订单剩余未分账的金额不会解冻回分账方商户，可以对该笔订单再次进行分账。
     * 示例值：true
     */
    @JsonProperty("unfreeze_unsplit")
    private boolean unfreezeUnsplit = true;

    @Data
    public static class Receivers {
        /**
         * 1、MERCHANT_ID：商户号
         * 2、PERSONAL_OPENID：个人openid（由父商户APPID转换得到）
         * 3、PERSONAL_SUB_OPENID: 个人sub_openid（由子商户APPID转换得到）
         * 示例值：MERCHANT_ID
         */
        private String type;
        /**
         * 1、分账接收方类型为MERCHANT_ID时，分账接收方账号为商户号
         * 2、分账接收方类型为PERSONAL_OPENID时，分账接收方账号为个人openid
         * 3、分账接收方类型为
         * PERSONAL_SUB_OPENID时，分账接收方账号为个人sub_openid
         * 示例值：86693852
         */
        private String account;
        /**
         * 可选项，在接收方类型为个人的时可选填，若有值，会检查与 name 是否实名匹配，不匹配会拒绝分账请求
         * 1、分账接收方类型是PERSONAL_OPENID或PERSONAL_SUB_OPENID时，是个人姓名的密文（选传，传则校验） 此字段的加密方法详见：敏感信息加密说明
         * 2、使用微信支付平台证书中的公钥
         * 3、使用RSAES-OAEP算法进行加密
         * 4、将请求中HTTP头部的Wechatpay-Serial设置为证书序列号
         * 示例值：hu89ohu89ohu89o
         */
        private String name;
        /**
         * 分账金额，单位为分，只能为整数，不能超过原订单支付金额及最大分账比例金额
         * 示例值：888
         */
        private int amount;
        /**
         * 分账的原因描述，分账账单中需要体现
         * 示例值：分给商户A
         */
        private String description;

        /**
         * 必填项构造函数
         * @param type
         * @param account
         * @param amount
         * @param description
         */
        public Receivers(String type, String account, int amount, String description) {
            this.type = type;
            this.account = account;
            this.amount = amount;
            this.description = description;
        }
    }

    /**
     * 必填项构造函数
     * @param transactionId
     * @param outOrderNo
     * @param receivers
     */
    public FacilV3PayProfitSharingResqBody(String transactionId, String outOrderNo, List<Receivers> receivers) {
        this.transactionId = transactionId;
        this.outOrderNo = outOrderNo;
        this.receivers = receivers;
    }
}
